home *** CD-ROM | disk | FTP | other *** search
- ; FILE: Source:modules/SCSIDEV43.ASM REV: 7 --- Install V43 scsi.device
-
- ;
- ; Plant V43 scsi.device -Module
- ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ; This patch module will install V43 scsi.device replacing one inside
- ; kickstart. It will also disable beta message of the scsi.device :)
- ;
- ; Device will be loaded from file "devs:scsi43.device".
- ;
- ; This module can't install A4000T_scsidisk 43.34 because it uses
- ; several hunks. Use V44 SetPatch + AmigaOS ROM Update to load it
- ; instead.
- ;
- ; This module has been tested with following scsi.device (a300.ld.strip)
- ; versions:
- ;
- ; 43.11 (3.9.96) Works fine for me.
- ; 43.17 (12.5.97) Works, but doesn't recognize my drives! :(
- ; 43.18 (15.6.97) Works fine.
- ; 43.23 (7.11.97) Works fine.
- ; 43.24 (9.11.98) Works fine.
- ; 43.34 (21.12.99) Works fine.
- ;
- ; Written by Harry Sintonen.
- ; This source code is Public Domain.
- ;
-
- incdir "include:" ; Some required...
- include "exec/types.i"
- include "exec/libraries.i"
- include "blizkickmodule.i"
-
- SCSI_MAXSIZE EQU 17352+4096
-
- _LVOCopyMem EQU -$270
-
- _LVOIoErr EQU -$84
- _LVOLoadSeg EQU -$96
- _LVOUnLoadSeg EQU -$9C
- _LVOSetIoErr EQU -$1CE
-
- call MACRO
- jsr (_LVO\1,a6)
- ENDM
-
- SECTION PATCH,CODE
- _DUMMY_LABEL
- BK_PTC
-
- ; Code is run with following incoming parameters:
- ;
- ; a0=ptr to ROM start (buffer) eg. $1DE087B8
- ; a1=ptr to ROM start (ROM) eg. $00F80000 (do *not* access!)
- ; d0=ROM lenght in bytes eg. $00080000
- ; a2=ptr to _FindResident routine (will search ROM buffer for resident tag):
- ; CALL: jsr (a2)
- ; IN: a0=ptr to ROM, d0=rom len, a1=ptr to resident name
- ; OUT: d0=ptr to resident (buf) or NULL
- ; a3=ptr to _InstallModule routine (can be used to plant a "module"):
- ; CALL: jsr (a3)
- ; IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
- ; OUT: d0=success
- ; a4=ptr to _Printf routine (will dump some silly things (errormsg?) to stdout ;-)
- ; CALL: jsr (a4)
- ; IN: a0=FmtString, a1=Array (may be 0), d6=dosbase
- ; OUT: -
- ; d6=dosbase, a6=execbase
- ;
- ; Code should return:
- ;
- ; d0=true if succeeded, false if failed.
- ; d1-d7/a0-a6 can be trashed. a7 *must* be preserved! ;-)
-
-
- ; NOTE: Kickstart *is* 2.0+
-
- cmp.w #39,($C,a0) ; Requires KS ROM V3.1+
- bhs.b .go
- moveq #0,d0
- rts
-
- .go movem.l d0/a0-a1,-(sp)
- moveq #0,d7
-
- lea (_scsiname,pc),a1 ; _FindResident
- jsr (a2)
- tst.l d0
- beq .xit
- move.l d0,a5 ; a5=scsi.device resident
-
- moveq #1,d7
- move.l (RT_IDSTRING,a5),a0
- sub.l (2*4,sp),a0 ;[a1]
- add.l (1*4,sp),a0 ;[a0]
- lea (_hdiname,pc),a1
- moveq #12-1,d1 ; 'IDE_scsidisk'
- .cmp move.b (a0)+,d0
- cmp.b (a1)+,d0
- dbne d1,.cmp
- tst.w d1 ; Test if already installed
- bmi .xit
-
- moveq #0,d7
- moveq #-1,d4 ; IoErr=-1 (default)
- exg d6,a6
- lea (_hddname,pc),a0
- move.l a0,d1
- call LoadSeg
- move.l d0,d5
- beq .exit
-
- move.l d5,a2
- add.l a2,a2
- add.l a2,a2
- tst.l (a2)+ ; Requires single hunk exe!
- bne .baddie ; a2=hunk start
-
- moveq #127,d0 ; Find resident:
- move.w #$4AFC,d1
- move.l a2,a0
- .findrt cmp.w (a0)+,d1
- dbeq d0,.findrt
- tst.w d0
- bmi .baddie
- subq.l #2,a0
- cmp.l (RT_MATCHTAG,a0),a0
- bne.b .findrt
-
- tst.b (RT_FLAGS,a0) ; Allow no RTF_AUTOINIT
- bmi .baddie
-
- ; a0=residenttag (loadsed), a2=1st seg start
- bsr makepcrel
-
- ; a0=residenttag (loadsed), a2=1st seg start
- bsr disablebeta
-
- lea (_buf,pc),a1
- move.l #BKMODULE_ID,(a1)+ ; bkm_ID
- move.l #(0)<<16!RTC_MATCHWORD,(a1)+ ; bkm_Flags RT_MATCHWORD
- clr.l (a1)+ ; RT_MATCHTAG
- moveq #RT_SIZE,d0
- add.l (RT_ENDSKIP,a0),d0
- sub.l a2,d0
- cmp.l #SCSI_MAXSIZE,d0 ; Too big?
- bhi.b .baddie ; It is quit!
-
- move.l d0,(a1)+ ; RT_ENDSKIP
- move.l (RT_FLAGS,a0),(a1)+ ; RT_FLAGS,RT_VERSION,RT_TYPE,RT_PRI
- moveq #RT_SIZE,d0
- add.l (RT_NAME,a0),d0
- sub.l a2,d0
- move.l d0,(a1)+ ; RT_NAME
- moveq #RT_SIZE,d0
- add.l (RT_IDSTRING,a0),d0
- sub.l a2,d0
- move.l d0,(a1)+ ; RT_IDSTRING
- moveq #RT_SIZE,d0
- add.l (RT_INIT,a0),d0
- sub.l a2,d0
- move.l d0,(a1)+ ; RT_INIT
-
- clr.w (a0) ; Kill old RT_MATCHWORD
-
- movem.l a0-a1,-(sp)
- move.l (RT_ENDSKIP,a0),d0
- sub.l a2,d0
- move.l a2,a0
- exg d6,a6 ;ex6--
- call CopyMem
- movem.l (sp)+,a0-a1
-
- ; IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
- movem.l (sp),d0/a0 ;[d0][a0]
- lea (_buf,pc),a1
-
- move.w ($C,a0),d1 ; Kludge fix kick version to scsi version...
- move.b (bkm_ResTag+RT_VERSION,a1),($C+1,a0)
- jsr (a3) ; _InstallModule
- move.w d1,($C,a0) ; Restore kick version
- exg d6,a6 ;--ex6
- move.l d0,d7 ; set success flag
-
- call IoErr
- move.l d0,d4
-
- lea (_nullstr,pc),a2
- tst.l d7
- beq.b .bskip2
-
- ;debug clr.w (a5) ; Kill ROM scsi.device ROMTag :)
-
- .baddie lea (_error2,pc),a2
- .bskip2 move.l d5,d1
- call UnLoadSeg
- bra.b .bskip
-
- .exit lea (_error1,pc),a2 ; a0=fmt
- .bskip
- exg d6,a6
- move.l d7,d0 ; Valid counter?
- bne.b .xit
- move.l a2,a0 ; a0=fmt
- pea (_hddname,pc)
- move.l sp,a1 ; a1=array
- jsr (a4) ; Call _Printf
- addq.l #4,sp
-
- move.l d4,d1
- addq.l #1,d4
- beq.b .skip
- exg d6,a6
- call SetIoErr
- .skip
- moveq #0,d0 ; Return fail
- .xit lea (3*4,sp),sp
- rts
-
-
-
- ; a0=residenttag (loadsed), a2=1st seg start
- makepcrel move.l a0,-(sp)
- move.l (RT_ENDSKIP,a0),d3 ;d3=max
- move.l a2,d2 ;d2=min
- move.l a2,a0
-
- .mpcloop addq.l #2,a0
- cmp.l a0,d3
- bls.b .mpcldone
-
- move.l (a0),d0
- cmp.l d0,d2
- bhi.b .mpcloop
- cmp.l d0,d3
- bls.b .mpcloop
-
- move.l (-2,a0),d1
-
- cmp.l #$4EB90000,d1 ; jsr abs.l -> jsr asb(pc); nop
- bne.b .mpcs0
- sub.l a0,d0
- move.w #$4EBA,(-2,a0)
- move.w d0,(a0)+
- move.w #$2048,(a0) ; move.l a0,a0 (nop)
- ;bra.b .mpcloop
- .mpcs0
- bra.b .mpcloop
- .mpcldone
- move.l (sp)+,a0
- rts
-
-
- ; a0=residenttag (loadsed), a2=1st seg start
- disablebeta move.l a0,-(sp)
- moveq #-(5*4),d3
- add.l (RT_ENDSKIP,a0),d3 ;d3=max
- move.l (RT_INIT,a0),d2 ;d2=min
- move.l d2,a0
-
- move.l #$48E7C0C0,d1 ;preload
-
- .loop addq.l #2,a0
- cmp.l a0,d3
- bls.b .done
-
- cmp.l (a0),d1
- bne.b .loop
- cmp.w #$206D,(4,a0)
- bne.b .loop
- tst.b (6,a0)
- bne.b .loop
- move.l (8,a0),d0
- and.l #$FFFFFFF0,d0
- cmp.l #$224E7000,d0
- bne.b .loop
- cmp.w #$6100,(12,a0)
- bne.b .loop
- cmp.l #$4CDF0303,(16,a0)
- bne.b .loop
-
- move.w #$6012,(a0) ;skip it!
- .done
- move.l (sp)+,a0
- rts
-
-
- _scsiname dc.b 'scsi.device',0
- _hdiname dc.b 'IDE_scsidisk',0
- _hddname dc.b 'devs:scsi43.device',0
-
- _error1 dc.b 'Couldn''t load "%s"!',10,0
- _error2 dc.b 'Couldn''t utilize this %s version!',10,0
- _nullstr EQU *-1
-
-
- CNOP 0,4
- _buf ds.b SCSI_MAXSIZE+bkm_ResTag+RT_SIZE
-
-
- SECTION VERSION,DATA
-
- dc.b '$VER: SCSIDEV43_PATCH 1.3 (8.1.00)',0
-